昨天我們探討了關聯式資料庫的基本概念和 SQL 基礎語法,今天我們將焦點轉向另一種日益盛行的資料庫類型 - 非關聯式資料庫(NoSQL),並以 MongoDB 為例,聊聊這種資料庫的應用場景。
非關聯式資料庫,也稱為 NoSQL 資料庫,是一種非傳統表格關聯模型的資料庫系統,與關聯式資料庫不同,NoSQL 資料庫通常具有更靈活的結構,能夠處理大量非結構化資料,並提供高度的可擴展性。
MongoDB 是最受歡迎的 NoSQL 資料庫之一,它使用靈活的文件模型來儲存資料,非常適合處理複雜的非結構化資料。
讓我們透過實際案例來了解 MongoDB 在處理複雜、多變資料結構時的優勢。
AWS(Amazon Web Services)作為全球最大的雲端供應商,提供非常多元的雲端服務,每種服務的計費模式和細項名稱都不盡相同,因此在每個項目之間建立正規化資料表挺繁瑣耗時的,透過 MongoDB 靈活資料結構的特性,來儲存這些多樣化的帳單明細,可以輕鬆應對不同服務的獨特屬性。
以下是幾個 AWS 服務帳單資料在 MongoDB 中的例子:
// EC2
{
"_id": ObjectId("5f8a7b2b9d3b2c1b4c5d6e7f"),
"service": "EC2",
"instanceId": "i-1234567890abcdef0",
"usageType": "BoxUsage:t2.micro",
"startTime": ISODate("2023-10-01T00:00:00Z"),
"endTime": ISODate("2023-10-01T01:00:00Z"),
"region": "us-east-1",
"cost": 0.0116,
"currency": "USD",
"attributes": {
"instanceType": "t2.micro",
"vCPU": 1,
"memory": "1 GiB",
"operatingSystem": "Linux"
}
}
// S3
{
"_id": ObjectId("5f8a7b2b9d3b2c1b4c5d6e80"),
"service": "S3",
"bucketName": "my-data-bucket",
"usageType": "StorageUsage",
"startTime": ISODate("2023-10-01T00:00:00Z"),
"endTime": ISODate("2023-10-31T23:59:59Z"),
"region": "us-west-2",
"cost": 0.023,
"currency": "USD",
"attributes": {
"storageClass": "Standard",
"dataStored": "1.5 GB",
"requestCount": {
"GET": 1000,
"PUT": 50
}
}
}
// RDS
{
"_id": ObjectId("5f8a7b2b9d3b2c1b4c5d6e81"),
"service": "RDS",
"instanceId": "db-1234567890abcdef0",
"usageType": "InstanceUsage:db.t3.micro",
"startTime": ISODate("2023-10-01T00:00:00Z"),
"endTime": ISODate("2023-10-01T24:00:00Z"),
"region": "eu-central-1",
"cost": 0.017,
"currency": "USD",
"attributes": {
"engineType": "MySQL",
"deploymentOption": "Single-AZ",
"storageType": "General Purpose SSD (gp2)",
"allocatedStorage": "20 GB"
}
}
在這個例子中,我們可以看到 MongoDB 如何靈活處理不同 AWS 服務的複雜計費資料:
靈活的資料結構:每種服務(EC2、S3、RDS)都有其獨特的屬性和計費模式,MongoDB 可以在同一個集合中儲存這些結構各異的文件,而無需預先定義固定的表格結構。
巢狀文件:對於像 S3 的 requestCount
這樣的物件屬性,MongoDB 允許使用巢狀文件,使資料結構更加直觀。
動態欄位:不同服務可能在未來新增新的計費指標,使用 MongoDB 可以輕鬆新增新欄位,而不需要修改整個資料庫結構。
高效查詢:儘管資料結構複雜,MongoDB 仍然可以高效地進行查詢。例如,我們可以輕鬆地查詢特定時間範圍內的所有 EC2 使用記錄:
db.awsBilling.find({
service: "EC2",
startTime: { $gte: ISODate("2023-10-01T00:00:00Z") },
endTime: { $lt: ISODate("2023-11-01T00:00:00Z") }
})
彙總分析:MongoDB 的彙總框架允許進行複雜的資料分析,比如計算每個服務在特定月份的總成本:
db.awsBilling.aggregate([
{
$match: {
startTime: { $gte: ISODate("2023-10-01T00:00:00Z") },
endTime: { $lt: ISODate("2023-11-01T00:00:00Z") }
}
},
{
$group: {
_id: "$service",
totalCost: { $sum: "$cost" }
}
}
])
這個 AWS Rawdata 的案例充分展示了 MongoDB 在處理複雜、多變資料結構時的優勢。它特別適合:
非關聯式資料庫,特別是 MongoDB 這樣的文件導向資料庫,為現代軟體開發提供了靈活、高效的資料儲存解決方案。在 AWS Rawdata 這樣的場景中,MongoDB 的優勢尤為明顯,能夠輕鬆應對複雜多變的資料結構,並支援高效的查詢和分析,雖然,高效的前提是需要下不少功夫去調整索引、優化查詢等等,但現階段的我們知道這種資料庫的特性是什麼就可以了!